Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

.specify/extensions/git/scripts/powershell/create-new-feature.ps1 b2a8377bbb01a5875eba4b12f6f1c7e7d9e60a91 (b2a8377b) Text, 14.65 KB

T8b949e#!/usr/bin/env pwsh
T8b949e# Git extension: create-new-feature.ps1
T8b949e# Adapted from core scripts/powershell/create-new-feature.ps1 for extension layout.
T8b949e# Sources common.ps1 from the project's installed scripts, falling back to
T8b949e# git-common.ps1 for minimal git helpers.
Tb4b4b4[Tff7b72CmdletBindingTb4b4b4(Tb4b4b4)Tb4b4b4]
Tff7b72paramTb4b4b4(
Tff7b72[switch]Te6edf3$JsonTb4b4b4,
Tff7b72[switch]Te6edf3$AllowExistingBranchTb4b4b4,
Tff7b72[switch]Te6edf3$DryRunTb4b4b4,
Tff7b72[string]Te6edf3$ShortNameTb4b4b4,
Tb4b4b4[Tff7b72ParameterTb4b4b4(Tb4b4b4)Tb4b4b4]
Tff7b72[long]Te6edf3$Number Tb4b4b4= Te6edf30Tb4b4b4,
Tff7b72[switch]Te6edf3$TimestampTb4b4b4,
Tff7b72[switch]Te6edf3$HelpTb4b4b4,
Tb4b4b4[Tff7b72ParameterTb4b4b4(Tff7b72Position Tb4b4b4= Te6edf30Tb4b4b4, Tff7b72ValueFromRemainingArguments Tb4b4b4= Te6edf3$trueTb4b4b4)Tb4b4b4]
Tff7b72[string[]]Te6edf3$FeatureDescription
Tb4b4b4)
Te6edf3$ErrorActionPreference Tb4b4b4= Ta5d6ff'Stop'

Tff7b72if Tb4b4b4(Te6edf3$HelpTb4b4b4) Tb4b4b4{
Tffa657Write-Host Ta5d6ff"Ta5d6ffUsage: ./create-new-feature.ps1 [-Json] [-DryRun] [-AllowExistingBranch] [-ShortName <name>] [-Number N] [-Timestamp] <feature description>Ta5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ffOptions:Ta5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff -Json Output in JSON formatTa5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff -DryRun Compute branch name without creating the branchTa5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff -AllowExistingBranch Switch to branch if it already exists instead of failingTa5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff -ShortName <name> Provide a custom short name (2-4 words) for the branchTa5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff -Number N Specify branch number manually (overrides auto-detection)Ta5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff -Timestamp Use timestamp prefix (YYYYMMDD-HHMMSS) instead of sequential numberingTa5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff -Help Show this help messageTa5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ffEnvironment variables:Ta5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff GIT_BRANCH_NAME Use this exact branch name, bypassing all prefix/suffix generationTa5d6ff"
Tffa657Write-Host Ta5d6ff"Ta5d6ff"
Te6edf3exit Te6edf30
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72-not Te6edf3$FeatureDescription Tff7b72-or Te6edf3$FeatureDescriptionTb4b4b4.Te6edf3Count Tff7b72-eq Te6edf30Tb4b4b4) Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffUsage: ./create-new-feature.ps1 [-Json] [-DryRun] [-AllowExistingBranch] [-ShortName <name>] [-Number N] [-Timestamp] <feature description>Ta5d6ff"
Te6edf3exit Te6edf31
Tb4b4b4}

Te6edf3$featureDesc Tb4b4b4= Tb4b4b4(Te6edf3$FeatureDescription Te6edf3-join Ta5d6ff' 'Tb4b4b4)Tb4b4b4.Te6edf3TrimTb4b4b4(Tb4b4b4)

Tff7b72if Tb4b4b4(Tff7b72[string]Tb4b4b4:Tb4b4b4:Te6edf3IsNullOrWhiteSpaceTb4b4b4(Te6edf3$featureDescTb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffError: Feature description cannot be empty or contain only whitespaceTa5d6ff"
Te6edf3exit Te6edf31
Tb4b4b4}

Tff7b72function Tffa657Get-HighestNumberFromSpecs Tb4b4b4{
Tff7b72paramTb4b4b4(Tff7b72[string]Te6edf3$SpecsDirTb4b4b4)

Tff7b72[long]Te6edf3$highest Tb4b4b4= Te6edf30
Tff7b72if Tb4b4b4(Tffa657Test-Path Te6edf3$SpecsDirTb4b4b4) Tb4b4b4{
Tffa657Get-ChildItem Te6edf3-Path Te6edf3$SpecsDir Te6edf3-Directory Tb4b4b4| Tff7b72ForEachTe6edf3-Object Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$_Tb4b4b4.Te6edf3Name Tff7b72-match Ta5d6ff'^(\d{3,})-' Tff7b72-and Te6edf3$_Tb4b4b4.Te6edf3Name Tff7b72-notmatch Ta5d6ff'^\d{8}-\d{6}-'Tb4b4b4) Tb4b4b4{
Tff7b72[long]Te6edf3$num Tb4b4b4= Te6edf30
Tff7b72if Tb4b4b4(Tff7b72[long]Tb4b4b4:Tb4b4b4:Te6edf3TryParseTb4b4b4(Te6edf3$matchesTb4b4b4[Te6edf31Tb4b4b4]Tb4b4b4, Tff7b72[ref]Te6edf3$numTb4b4b4) Tff7b72-and Te6edf3$num Tff7b72-gt Te6edf3$highestTb4b4b4) Tb4b4b4{
Te6edf3$highest Tb4b4b4= Te6edf3$num
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3$highest
Tb4b4b4}

Tff7b72function Tffa657Get-HighestNumberFromNames Tb4b4b4{
Tff7b72paramTb4b4b4(Tff7b72[string[]]Te6edf3$NamesTb4b4b4)

Tff7b72[long]Te6edf3$highest Tb4b4b4= Te6edf30
Tff7b72foreach Tb4b4b4(Te6edf3$name Tff7b72in Te6edf3$NamesTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$name Tff7b72-match Ta5d6ff'^(\d{3,})-' Tff7b72-and Te6edf3$name Tff7b72-notmatch Ta5d6ff'^\d{8}-\d{6}-'Tb4b4b4) Tb4b4b4{
Tff7b72[long]Te6edf3$num Tb4b4b4= Te6edf30
Tff7b72if Tb4b4b4(Tff7b72[long]Tb4b4b4:Tb4b4b4:Te6edf3TryParseTb4b4b4(Te6edf3$matchesTb4b4b4[Te6edf31Tb4b4b4]Tb4b4b4, Tff7b72[ref]Te6edf3$numTb4b4b4) Tff7b72-and Te6edf3$num Tff7b72-gt Te6edf3$highestTb4b4b4) Tb4b4b4{
Te6edf3$highest Tb4b4b4= Te6edf3$num
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3$highest
Tb4b4b4}

Tff7b72function Tffa657Get-HighestNumberFromBranches Tb4b4b4{
Tff7b72paramTb4b4b4(Tb4b4b4)

Tff7b72try Tb4b4b4{
Te6edf3$branches Tb4b4b4= Te6edf3git Te6edf3branch Te6edf3-a Te6edf32Tb4b4b4>Te6edf3$null
Tff7b72if Tb4b4b4(Te6edf3$LASTEXITCODE Tff7b72-eq Te6edf30 Tff7b72-and Te6edf3$branchesTb4b4b4) Tb4b4b4{
Te6edf3$cleanNames Tb4b4b4= Te6edf3$branches Tb4b4b4| Tff7b72ForEachTe6edf3-Object Tb4b4b4{
Te6edf3$_Tb4b4b4.Te6edf3TrimTb4b4b4(Tb4b4b4) Tff7b72-replace Ta5d6ff'^\*?\s+'Tb4b4b4, Ta5d6ff'' Tff7b72-replace Ta5d6ff'^remotes/[^/]+/'Tb4b4b4, Ta5d6ff''
Tb4b4b4}
Tff7b72return Tffa657Get-HighestNumberFromNames Te6edf3-Names Te6edf3$cleanNames
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tffa657Write-Verbose Ta5d6ff"Ta5d6ffCould not check Git branches: Ta5d6ff$Ta5d6ff_Ta5d6ff"
Tb4b4b4}
Tff7b72return Te6edf30
Tb4b4b4}

Tff7b72function Tffa657Get-HighestNumberFromRemoteRefs Tb4b4b4{
Tff7b72[long]Te6edf3$highest Tb4b4b4= Te6edf30
Tff7b72try Tb4b4b4{
Te6edf3$remotes Tb4b4b4= Te6edf3git Te6edf3remote Te6edf32Tb4b4b4>Te6edf3$null
Tff7b72if Tb4b4b4(Te6edf3$remotesTb4b4b4) Tb4b4b4{
Tff7b72foreach Tb4b4b4(Te6edf3$remote Tff7b72in Te6edf3$remotesTb4b4b4) Tb4b4b4{
Te6edf3$env:GIT_TERMINAL_PROMPT Tb4b4b4= Ta5d6ff'0'
Te6edf3$refs Tb4b4b4= Te6edf3git Te6edf3lsTe6edf3-remote Tb4b4b4-Te6edf3-heads Te6edf3$remote Te6edf32Tb4b4b4>Te6edf3$null
Te6edf3$env:GIT_TERMINAL_PROMPT Tb4b4b4= Te6edf3$null
Tff7b72if Tb4b4b4(Te6edf3$LASTEXITCODE Tff7b72-eq Te6edf30 Tff7b72-and Te6edf3$refsTb4b4b4) Tb4b4b4{
Te6edf3$refNames Tb4b4b4= Te6edf3$refs Tb4b4b4| Tff7b72ForEachTe6edf3-Object Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$_ Tff7b72-match Ta5d6ff'refs/heads/(.+)$'Tb4b4b4) Tb4b4b4{ Te6edf3$matchesTb4b4b4[Te6edf31Tb4b4b4] Tb4b4b4}
Tb4b4b4} Tb4b4b4| Tffa657Where-Object Tb4b4b4{ Te6edf3$_ Tb4b4b4}
Te6edf3$remoteHighest Tb4b4b4= Tffa657Get-HighestNumberFromNames Te6edf3-Names Te6edf3$refNames
Tff7b72if Tb4b4b4(Te6edf3$remoteHighest Tff7b72-gt Te6edf3$highestTb4b4b4) Tb4b4b4{ Te6edf3$highest Tb4b4b4= Te6edf3$remoteHighest Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tffa657Write-Verbose Ta5d6ff"Ta5d6ffCould not query remote refs: Ta5d6ff$Ta5d6ff_Ta5d6ff"
Tb4b4b4}
Tff7b72return Te6edf3$highest
Tb4b4b4}

Tff7b72function Tffa657Get-NextBranchNumber Tb4b4b4{
Tff7b72paramTb4b4b4(
Tff7b72[string]Te6edf3$SpecsDirTb4b4b4,
Tff7b72[switch]Te6edf3$SkipFetch
Tb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3$SkipFetchTb4b4b4) Tb4b4b4{
Te6edf3$highestBranch Tb4b4b4= Tffa657Get-HighestNumberFromBranches
Te6edf3$highestRemote Tb4b4b4= Tffa657Get-HighestNumberFromRemoteRefs
Te6edf3$highestBranch Tb4b4b4= Tff7b72[Math]Tb4b4b4:Tb4b4b4:Te6edf3MaxTb4b4b4(Te6edf3$highestBranchTb4b4b4, Te6edf3$highestRemoteTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3git Te6edf3fetch Tb4b4b4-Te6edf3-all Tb4b4b4-Te6edf3-prune Te6edf32Tb4b4b4>Te6edf3$null Tb4b4b4| Tffa657Out-Null
Tb4b4b4} Tff7b72catch Tb4b4b4{ Tb4b4b4}
Te6edf3$highestBranch Tb4b4b4= Tffa657Get-HighestNumberFromBranches
Tb4b4b4}

Te6edf3$highestSpec Tb4b4b4= Tffa657Get-HighestNumberFromSpecs Te6edf3-SpecsDir Te6edf3$SpecsDir
Te6edf3$maxNum Tb4b4b4= Tff7b72[Math]Tb4b4b4:Tb4b4b4:Te6edf3MaxTb4b4b4(Te6edf3$highestBranchTb4b4b4, Te6edf3$highestSpecTb4b4b4)
Tff7b72return Te6edf3$maxNum Tb4b4b4+ Te6edf31
Tb4b4b4}

Tff7b72function Tffa657ConvertTo-CleanBranchName Tb4b4b4{
Tff7b72paramTb4b4b4(Tff7b72[string]Te6edf3$NameTb4b4b4)
Tff7b72return Te6edf3$NameTb4b4b4.Te6edf3ToLowerTb4b4b4(Tb4b4b4) Tff7b72-replace Ta5d6ff'[^a-z0-9]'Tb4b4b4, Ta5d6ff'-' Tff7b72-replace Ta5d6ff'-{2,}'Tb4b4b4, Ta5d6ff'-' Tff7b72-replace Ta5d6ff'^-'Tb4b4b4, Ta5d6ff'' Tff7b72-replace Ta5d6ff'-$'Tb4b4b4, Ta5d6ff''
Tb4b4b4}

T8b949e# ---------------------------------------------------------------------------
T8b949e# Source common.ps1 from the project's installed scripts.
T8b949e# Search locations in priority order:
T8b949e# 1. .specify/scripts/powershell/common.ps1 under the project root
T8b949e# 2. scripts/powershell/common.ps1 under the project root (source checkout)
T8b949e# 3. git-common.ps1 next to this script (minimal fallback)
T8b949e# ---------------------------------------------------------------------------
Tff7b72function Tffa657Find-ProjectRoot Tb4b4b4{
Tff7b72paramTb4b4b4(Tff7b72[string]Te6edf3$StartDirTb4b4b4)
Te6edf3$current Tb4b4b4= Tffa657Resolve-Path Te6edf3$StartDir
Tff7b72while Tb4b4b4(Te6edf3$trueTb4b4b4) Tb4b4b4{
Tff7b72foreach Tb4b4b4(Te6edf3$marker Tff7b72in Tb4b4b4@Tb4b4b4(Ta5d6ff'.specify'Tb4b4b4, Ta5d6ff'.git'Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657Test-Path Tb4b4b4(Tffa657Join-Path Te6edf3$current Te6edf3$markerTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3$current
Tb4b4b4}
Tb4b4b4}
Te6edf3$parent Tb4b4b4= Tffa657Split-Path Te6edf3$current Te6edf3-Parent
Tff7b72if Tb4b4b4(Te6edf3$parent Tff7b72-eq Te6edf3$currentTb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3$null Tb4b4b4}
Te6edf3$current Tb4b4b4= Te6edf3$parent
Tb4b4b4}
Tb4b4b4}

Te6edf3$projectRoot Tb4b4b4= Tffa657Find-ProjectRoot Te6edf3-StartDir Te6edf3$PSScriptRoot
Te6edf3$commonLoaded Tb4b4b4= Te6edf3$false

Tff7b72if Tb4b4b4(Te6edf3$projectRootTb4b4b4) Tb4b4b4{
Te6edf3$candidates Tb4b4b4= Tb4b4b4@Tb4b4b4(
Tb4b4b4(Tffa657Join-Path Te6edf3$projectRoot Ta5d6ff"Ta5d6ff.specify/scripts/powershell/common.ps1Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Tffa657Join-Path Te6edf3$projectRoot Ta5d6ff"Ta5d6ffscripts/powershell/common.ps1Ta5d6ff"Tb4b4b4)
Tb4b4b4)
Tff7b72foreach Tb4b4b4(Te6edf3$candidate Tff7b72in Te6edf3$candidatesTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657Test-Path Te6edf3$candidateTb4b4b4) Tb4b4b4{
Tb4b4b4. Te6edf3$candidate
Te6edf3$commonLoaded Tb4b4b4= Te6edf3$true
Tff7b72break
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72-not Te6edf3$commonLoaded Tff7b72-and Tb4b4b4(Tffa657Test-Path Ta5d6ff"Ta5d6ff$Ta5d6ffPSScriptRoot/git-common.ps1Ta5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tb4b4b4. Ta5d6ff"Ta5d6ff$Ta5d6ffPSScriptRoot/git-common.ps1Ta5d6ff"
Te6edf3$commonLoaded Tb4b4b4= Te6edf3$true
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72-not Te6edf3$commonLoadedTb4b4b4) Tb4b4b4{
Tff7b72throw Ta5d6ff"Ta5d6ffUnable to locate common script file. Please ensure the Specify core scripts are installed.Ta5d6ff"
Tb4b4b4}

T8b949e# Resolve repository root
Tff7b72if Tb4b4b4(Tffa657Get-Command Tffa657Get-RepoRoot Te6edf3-ErrorAction Te6edf3SilentlyContinueTb4b4b4) Tb4b4b4{
Te6edf3$repoRoot Tb4b4b4= Tffa657Get-RepoRoot
Tb4b4b4} Tff7b72elseif Tb4b4b4(Te6edf3$projectRootTb4b4b4) Tb4b4b4{
Te6edf3$repoRoot Tb4b4b4= Te6edf3$projectRoot
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72throw Ta5d6ff"Ta5d6ffCould not determine repository root.Ta5d6ff"
Tb4b4b4}

T8b949e# Check if git is available
Tff7b72if Tb4b4b4(Tffa657Get-Command Tffa657Test-HasGit Te6edf3-ErrorAction Te6edf3SilentlyContinueTb4b4b4) Tb4b4b4{
T8b949e# Call without parameters for compatibility with core common.ps1 (no -RepoRoot param)
T8b949e# and git-common.ps1 (has -RepoRoot param with default).
Te6edf3$hasGit Tb4b4b4= Tffa657Test-HasGit
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3git Te6edf3-C Te6edf3$repoRoot Te6edf3revTe6edf3-parse Tb4b4b4-Tff7b72-isTe6edf3-insideTe6edf3-workTe6edf3-tree Te6edf32Tb4b4b4>Te6edf3$null Tb4b4b4| Tffa657Out-Null
Te6edf3$hasGit Tb4b4b4= Tb4b4b4(Te6edf3$LASTEXITCODE Tff7b72-eq Te6edf30Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4{
Te6edf3$hasGit Tb4b4b4= Te6edf3$false
Tb4b4b4}
Tb4b4b4}

Tffa657Set-Location Te6edf3$repoRoot

Te6edf3$specsDir Tb4b4b4= Tffa657Join-Path Te6edf3$repoRoot Ta5d6ff'specs'

Tff7b72function Tffa657Get-BranchName Tb4b4b4{
Tff7b72paramTb4b4b4(Tff7b72[string]Te6edf3$DescriptionTb4b4b4)

Te6edf3$stopWords Tb4b4b4= Tb4b4b4@Tb4b4b4(
Ta5d6ff'i'Tb4b4b4, Ta5d6ff'a'Tb4b4b4, Ta5d6ff'an'Tb4b4b4, Ta5d6ff'the'Tb4b4b4, Ta5d6ff'to'Tb4b4b4, Ta5d6ff'for'Tb4b4b4, Ta5d6ff'of'Tb4b4b4, Ta5d6ff'in'Tb4b4b4, Ta5d6ff'on'Tb4b4b4, Ta5d6ff'at'Tb4b4b4, Ta5d6ff'by'Tb4b4b4, Ta5d6ff'with'Tb4b4b4, Ta5d6ff'from'Tb4b4b4,
Ta5d6ff'is'Tb4b4b4, Ta5d6ff'are'Tb4b4b4, Ta5d6ff'was'Tb4b4b4, Ta5d6ff'were'Tb4b4b4, Ta5d6ff'be'Tb4b4b4, Ta5d6ff'been'Tb4b4b4, Ta5d6ff'being'Tb4b4b4, Ta5d6ff'have'Tb4b4b4, Ta5d6ff'has'Tb4b4b4, Ta5d6ff'had'Tb4b4b4,
Ta5d6ff'do'Tb4b4b4, Ta5d6ff'does'Tb4b4b4, Ta5d6ff'did'Tb4b4b4, Ta5d6ff'will'Tb4b4b4, Ta5d6ff'would'Tb4b4b4, Ta5d6ff'should'Tb4b4b4, Ta5d6ff'could'Tb4b4b4, Ta5d6ff'can'Tb4b4b4, Ta5d6ff'may'Tb4b4b4, Ta5d6ff'might'Tb4b4b4, Ta5d6ff'must'Tb4b4b4, Ta5d6ff'shall'Tb4b4b4,
Ta5d6ff'this'Tb4b4b4, Ta5d6ff'that'Tb4b4b4, Ta5d6ff'these'Tb4b4b4, Ta5d6ff'those'Tb4b4b4, Ta5d6ff'my'Tb4b4b4, Ta5d6ff'your'Tb4b4b4, Ta5d6ff'our'Tb4b4b4, Ta5d6ff'their'Tb4b4b4,
Ta5d6ff'want'Tb4b4b4, Ta5d6ff'need'Tb4b4b4, Ta5d6ff'add'Tb4b4b4, Ta5d6ff'get'Tb4b4b4, Ta5d6ff'set'
Tb4b4b4)

Te6edf3$cleanName Tb4b4b4= Te6edf3$DescriptionTb4b4b4.Te6edf3ToLowerTb4b4b4(Tb4b4b4) Tff7b72-replace Ta5d6ff'[^a-z0-9\s]'Tb4b4b4, Ta5d6ff' '
Te6edf3$words Tb4b4b4= Te6edf3$cleanName Te6edf3-split Ta5d6ff'\s+' Tb4b4b4| Tffa657Where-Object Tb4b4b4{ Te6edf3$_ Tb4b4b4}

Te6edf3$meaningfulWords Tb4b4b4= Tb4b4b4@Tb4b4b4(Tb4b4b4)
Tff7b72foreach Tb4b4b4(Te6edf3$word Tff7b72in Te6edf3$wordsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$stopWords Tff7b72-contains Te6edf3$wordTb4b4b4) Tb4b4b4{ Tff7b72continue Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3$wordTb4b4b4.Te6edf3Length Tff7b72-ge Te6edf33Tb4b4b4) Tb4b4b4{
Te6edf3$meaningfulWords Tb4b4b4+Tb4b4b4= Te6edf3$word
Tb4b4b4} Tff7b72elseif Tb4b4b4(Te6edf3$Description Tff7b72-match Ta5d6ff"Ta5d6ff\bTb4b4b4$(Te6edf3$wordTb4b4b4.Te6edf3ToUpperTb4b4b4(Tb4b4b4)Tb4b4b4)Ta5d6ff\bTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3$meaningfulWords Tb4b4b4+Tb4b4b4= Te6edf3$word
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3$meaningfulWordsTb4b4b4.Te6edf3Count Tff7b72-gt Te6edf30Tb4b4b4) Tb4b4b4{
Te6edf3$maxWords Tb4b4b4= Tff7b72if Tb4b4b4(Te6edf3$meaningfulWordsTb4b4b4.Te6edf3Count Tff7b72-eq Te6edf34Tb4b4b4) Tb4b4b4{ Te6edf34 Tb4b4b4} Tff7b72else Tb4b4b4{ Te6edf33 Tb4b4b4}
Te6edf3$result Tb4b4b4= Tb4b4b4(Te6edf3$meaningfulWords Tb4b4b4| Tffa657Select-Object Te6edf3-First Te6edf3$maxWordsTb4b4b4) Te6edf3-join Ta5d6ff'-'
Tff7b72return Te6edf3$result
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3$result Tb4b4b4= Tffa657ConvertTo-CleanBranchName Te6edf3-Name Te6edf3$Description
Te6edf3$fallbackWords Tb4b4b4= Tb4b4b4(Te6edf3$result Te6edf3-split Ta5d6ff'-'Tb4b4b4) Tb4b4b4| Tffa657Where-Object Tb4b4b4{ Te6edf3$_ Tb4b4b4} Tb4b4b4| Tffa657Select-Object Te6edf3-First Te6edf33
Tff7b72return Tff7b72[string]Tb4b4b4:Tb4b4b4:Te6edf3JoinTb4b4b4(Ta5d6ff'-'Tb4b4b4, Te6edf3$fallbackWordsTb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e# Check for GIT_BRANCH_NAME env var override (exact branch name, no prefix/suffix)
Tff7b72if Tb4b4b4(Te6edf3$env:GIT_BRANCH_NAMETb4b4b4) Tb4b4b4{
Te6edf3$branchName Tb4b4b4= Te6edf3$env:GIT_BRANCH_NAME
T8b949e# Check 244-byte limit (UTF-8) for override names
Te6edf3$branchNameUtf8ByteCount Tb4b4b4= Tff7b72[System.Text.Encoding]Tb4b4b4:Tb4b4b4:Te6edf3UTF8Tb4b4b4.Te6edf3GetByteCountTb4b4b4(Te6edf3$branchNameTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3$branchNameUtf8ByteCount Tff7b72-gt Te6edf3244Tb4b4b4) Tb4b4b4{
Tff7b72throw Ta5d6ff"Ta5d6ffGIT_BRANCH_NAME must be 244 bytes or fewer in UTF-8. Provided value is Ta5d6ff$Ta5d6ffbranchNameUtf8ByteCount bytes; please supply a shorter override branch name.Ta5d6ff"
Tb4b4b4}
T8b949e# Extract FEATURE_NUM from the branch name if it starts with a numeric prefix
T8b949e# Check timestamp pattern first (YYYYMMDD-HHMMSS-) since it also matches the simpler ^\d+ pattern
Tff7b72if Tb4b4b4(Te6edf3$branchName Tff7b72-match Ta5d6ff'^(\d{8}-\d{6})-'Tb4b4b4) Tb4b4b4{
Te6edf3$featureNum Tb4b4b4= Te6edf3$matchesTb4b4b4[Te6edf31Tb4b4b4]
Tb4b4b4} Tff7b72elseif Tb4b4b4(Te6edf3$branchName Tff7b72-match Ta5d6ff'^(\d+)-'Tb4b4b4) Tb4b4b4{
Te6edf3$featureNum Tb4b4b4= Te6edf3$matchesTb4b4b4[Te6edf31Tb4b4b4]
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3$featureNum Tb4b4b4= Te6edf3$branchName
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$ShortNameTb4b4b4) Tb4b4b4{
Te6edf3$branchSuffix Tb4b4b4= Tffa657ConvertTo-CleanBranchName Te6edf3-Name Te6edf3$ShortName
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3$branchSuffix Tb4b4b4= Tffa657Get-BranchName Te6edf3-Description Te6edf3$featureDesc
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3$Timestamp Tff7b72-and Te6edf3$Number Tff7b72-ne Te6edf30Tb4b4b4) Tb4b4b4{
Tffa657Write-Warning Ta5d6ff"Ta5d6ff[specify] Warning: -Number is ignored when -Timestamp is usedTa5d6ff"
Te6edf3$Number Tb4b4b4= Te6edf30
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3$TimestampTb4b4b4) Tb4b4b4{
Te6edf3$featureNum Tb4b4b4= Tffa657Get-Date Te6edf3-Format Ta5d6ff'yyyyMMdd-HHmmss'
Te6edf3$branchName Tb4b4b4= Ta5d6ff"Ta5d6ff$Ta5d6fffeatureNum-Ta5d6ff$Ta5d6ffbranchSuffixTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$Number Tff7b72-eq Te6edf30Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$DryRun Tff7b72-and Te6edf3$hasGitTb4b4b4) Tb4b4b4{
Te6edf3$Number Tb4b4b4= Tffa657Get-NextBranchNumber Te6edf3-SpecsDir Te6edf3$specsDir Te6edf3-SkipFetch
Tb4b4b4} Tff7b72elseif Tb4b4b4(Te6edf3$DryRunTb4b4b4) Tb4b4b4{
Te6edf3$Number Tb4b4b4= Tb4b4b4(Tffa657Get-HighestNumberFromSpecs Te6edf3-SpecsDir Te6edf3$specsDirTb4b4b4) Tb4b4b4+ Te6edf31
Tb4b4b4} Tff7b72elseif Tb4b4b4(Te6edf3$hasGitTb4b4b4) Tb4b4b4{
Te6edf3$Number Tb4b4b4= Tffa657Get-NextBranchNumber Te6edf3-SpecsDir Te6edf3$specsDir
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3$Number Tb4b4b4= Tb4b4b4(Tffa657Get-HighestNumberFromSpecs Te6edf3-SpecsDir Te6edf3$specsDirTb4b4b4) Tb4b4b4+ Te6edf31
Tb4b4b4}
Tb4b4b4}

Te6edf3$featureNum Tb4b4b4= Tb4b4b4(Ta5d6ff'{0:000}' Tff7b72-f Te6edf3$NumberTb4b4b4)
Te6edf3$branchName Tb4b4b4= Ta5d6ff"Ta5d6ff$Ta5d6fffeatureNum-Ta5d6ff$Ta5d6ffbranchSuffixTa5d6ff"
Tb4b4b4}
Tb4b4b4}

Te6edf3$maxBranchLength Tb4b4b4= Te6edf3244
Tff7b72if Tb4b4b4(Te6edf3$branchNameTb4b4b4.Te6edf3Length Tff7b72-gt Te6edf3$maxBranchLengthTb4b4b4) Tb4b4b4{
Te6edf3$prefixLength Tb4b4b4= Te6edf3$featureNumTb4b4b4.Te6edf3Length Tb4b4b4+ Te6edf31
Te6edf3$maxSuffixLength Tb4b4b4= Te6edf3$maxBranchLength Tb4b4b4- Te6edf3$prefixLength

Te6edf3$truncatedSuffix Tb4b4b4= Te6edf3$branchSuffixTb4b4b4.Te6edf3SubstringTb4b4b4(Te6edf30Tb4b4b4, Tff7b72[Math]Tb4b4b4:Tb4b4b4:Te6edf3MinTb4b4b4(Te6edf3$branchSuffixTb4b4b4.Te6edf3LengthTb4b4b4, Te6edf3$maxSuffixLengthTb4b4b4)Tb4b4b4)
Te6edf3$truncatedSuffix Tb4b4b4= Te6edf3$truncatedSuffix Tff7b72-replace Ta5d6ff'-$'Tb4b4b4, Ta5d6ff''

Te6edf3$originalBranchName Tb4b4b4= Te6edf3$branchName
Te6edf3$branchName Tb4b4b4= Ta5d6ff"Ta5d6ff$Ta5d6fffeatureNum-Ta5d6ff$Ta5d6fftruncatedSuffixTa5d6ff"

Tffa657Write-Warning Ta5d6ff"Ta5d6ff[specify] Branch name exceeded GitHub's 244-byte limitTa5d6ff"
Tffa657Write-Warning Ta5d6ff"Ta5d6ff[specify] Original: Ta5d6ff$Ta5d6fforiginalBranchName (Tb4b4b4$(Te6edf3$originalBranchNameTb4b4b4.Te6edf3LengthTb4b4b4)Ta5d6ff bytes)Ta5d6ff"
Tffa657Write-Warning Ta5d6ff"Ta5d6ff[specify] Truncated to: Ta5d6ff$Ta5d6ffbranchName (Tb4b4b4$(Te6edf3$branchNameTb4b4b4.Te6edf3LengthTb4b4b4)Ta5d6ff bytes)Ta5d6ff"
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72-not Te6edf3$DryRunTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$hasGitTb4b4b4) Tb4b4b4{
Te6edf3$branchCreated Tb4b4b4= Te6edf3$false
Te6edf3$branchCreateError Tb4b4b4= Ta5d6ff''
Tff7b72try Tb4b4b4{
Te6edf3$branchCreateError Tb4b4b4= Te6edf3git Te6edf3checkout Te6edf3-q Te6edf3-b Te6edf3$branchName Te6edf32Tb4b4b4>Tb4b4b4&Te6edf31 Tb4b4b4| Tffa657Out-String
Tff7b72if Tb4b4b4(Te6edf3$LASTEXITCODE Tff7b72-eq Te6edf30Tb4b4b4) Tb4b4b4{
Te6edf3$branchCreated Tb4b4b4= Te6edf3$true
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4{
Te6edf3$branchCreateError Tb4b4b4= Te6edf3$_Tb4b4b4.Te6edf3ExceptionTb4b4b4.Te6edf3Message
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72-not Te6edf3$branchCreatedTb4b4b4) Tb4b4b4{
Te6edf3$currentBranch Tb4b4b4= Ta5d6ff''
Tff7b72try Tb4b4b4{ Te6edf3$currentBranch Tb4b4b4= Tb4b4b4(Te6edf3git Te6edf3revTe6edf3-parse Tb4b4b4-Te6edf3-abbrevTe6edf3-ref Te6edf3HEAD Te6edf32Tb4b4b4>Te6edf3$nullTb4b4b4)Tb4b4b4.Te6edf3TrimTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72catch Tb4b4b4{Tb4b4b4}
Te6edf3$existingBranch Tb4b4b4= Te6edf3git Te6edf3branch Tb4b4b4-Te6edf3-list Te6edf3$branchName Te6edf32Tb4b4b4>Te6edf3$null
Tff7b72if Tb4b4b4(Te6edf3$existingBranchTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$AllowExistingBranchTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$currentBranch Tff7b72-eq Te6edf3$branchNameTb4b4b4) Tb4b4b4{
T8b949e# Already on the target branch
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3$switchBranchError Tb4b4b4= Te6edf3git Te6edf3checkout Te6edf3-q Te6edf3$branchName Te6edf32Tb4b4b4>Tb4b4b4&Te6edf31 Tb4b4b4| Tffa657Out-String
Tff7b72if Tb4b4b4(Te6edf3$LASTEXITCODE Tff7b72-ne Te6edf30Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$switchBranchErrorTb4b4b4) Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffError: Branch 'Ta5d6ff$Ta5d6ffbranchName' exists but could not be checked out.Tffea00`nTb4b4b4$(Te6edf3$switchBranchErrorTb4b4b4.Te6edf3TrimTb4b4b4(Tb4b4b4)Tb4b4b4)Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffError: Branch 'Ta5d6ff$Ta5d6ffbranchName' exists but could not be checked out. Resolve any uncommitted changes or conflicts and try again.Ta5d6ff"
Tb4b4b4}
Te6edf3exit Te6edf31
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72elseif Tb4b4b4(Te6edf3$TimestampTb4b4b4) Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffError: Branch 'Ta5d6ff$Ta5d6ffbranchName' already exists. Rerun to get a new timestamp or use a different -ShortName.Ta5d6ff"
Te6edf3exit Te6edf31
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffError: Branch 'Ta5d6ff$Ta5d6ffbranchName' already exists. Please use a different feature name or specify a different number with -Number.Ta5d6ff"
Te6edf3exit Te6edf31
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$branchCreateErrorTb4b4b4) Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffError: Failed to create git branch 'Ta5d6ff$Ta5d6ffbranchName'.Tffea00`nTb4b4b4$(Te6edf3$branchCreateErrorTb4b4b4.Te6edf3TrimTb4b4b4(Tb4b4b4)Tb4b4b4)Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657Write-Error Ta5d6ff"Ta5d6ffError: Failed to create git branch 'Ta5d6ff$Ta5d6ffbranchName'. Please check your git configuration and try again.Ta5d6ff"
Tb4b4b4}
Te6edf3exit Te6edf31
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3$JsonTb4b4b4) Tb4b4b4{
Tff7b72[Console]Tb4b4b4:Tb4b4b4:Te6edf3ErrorTb4b4b4.Te6edf3WriteLineTb4b4b4(Ta5d6ff"Ta5d6ff[specify] Warning: Git repository not detected; skipped branch creation for Ta5d6ff$Ta5d6ffbranchNameTa5d6ff"Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657Write-Warning Ta5d6ff"Ta5d6ff[specify] Warning: Git repository not detected; skipped branch creation for Ta5d6ff$Ta5d6ffbranchNameTa5d6ff"
Tb4b4b4}
Tb4b4b4}

Te6edf3$env:SPECIFY_FEATURE Tb4b4b4= Te6edf3$branchName
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3$JsonTb4b4b4) Tb4b4b4{
Te6edf3$obj Tb4b4b4= Tff7b72[PSCustomObject]Tb4b4b4@Tb4b4b4{
Te6edf3BRANCH_NAME Tb4b4b4= Te6edf3$branchName
Te6edf3FEATURE_NUM Tb4b4b4= Te6edf3$featureNum
Te6edf3HAS_GIT Tb4b4b4= Te6edf3$hasGit
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3$DryRunTb4b4b4) Tb4b4b4{
Te6edf3$obj Tb4b4b4| Tffa657Add-Member Te6edf3-NotePropertyName Ta5d6ff'DRY_RUN' Te6edf3-NotePropertyValue Te6edf3$true
Tb4b4b4}
Te6edf3$obj Tb4b4b4| Tffa657ConvertTo-Json Te6edf3-Compress
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657Write-Output Ta5d6ff"Ta5d6ffBRANCH_NAME: Ta5d6ff$Ta5d6ffbranchNameTa5d6ff"
Tffa657Write-Output Ta5d6ff"Ta5d6ffFEATURE_NUM: Ta5d6ff$Ta5d6fffeatureNumTa5d6ff"
Tffa657Write-Output Ta5d6ff"Ta5d6ffHAS_GIT: Ta5d6ff$Ta5d6ffhasGitTa5d6ff"
Tff7b72if Tb4b4b4(Tff7b72-not Te6edf3$DryRunTb4b4b4) Tb4b4b4{
Tffa657Write-Output Ta5d6ff"Ta5d6ffSPECIFY_FEATURE environment variable set to: Ta5d6ff$Ta5d6ffbranchNameTa5d6ff"
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.05s